﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Leap.Unity;
using Leap;
using UnityEngine.UI;
using System.Runtime.InteropServices;


/// <summary>
/// 手势   分为姿势和状态
/// </summary>
public class HandGesture : MonoBehaviour
{

    public Text leftStatusText;
    public Text rightStatusText;

    public Text leftPoseText;
    public Text rightPoseText;


    public UnityEngine.UI.Image leftHandImg;
    public UnityEngine.UI.Image rightHandImg;

    [Tooltip("手的移动速度 ")]
    public float deltaVelocity = 0.7f;
    [Tooltip("手的移动速度，最小临界")]
    public float smallestVelocity = 0.4f;
    [Tooltip("握拳检测标量")]
    public float fistStrenth = 0.8f;

    private LeapServiceProvider provider;
    Hand _leftHand;
    Hand _rightHand;
    private void Start()
    {
        provider = transform.GetComponent<LeapServiceProvider>();
    }
    private void Update()
    {
        _leftHand = provider.Get(Chirality.Left);
        _rightHand = provider.Get(Chirality.Right);

        //左手检测

        //if (provider.Get(Chirality.Left) != null)
        //{
        //    //print(isMoveLeft(provider.Get(Chirality.Left)));
        //    leftHandImg.color = Color.green;
        //    //检测不动
        //    if (isStationary(provider.Get(Chirality.Left)))
        //    {
        //        leftStatusText.text = "左手状态：" + "静止";
        //    }
        //    if (isMoveLeft(provider.Get(Chirality.Left)))
        //    {
        //        leftStatusText.text = "左手状态：" + "左移";
        //    }
        //    //检测向右移
        //    if (isMoveRight(provider.Get(Chirality.Left)))
        //    {
        //        leftStatusText.text = "左手状态：" + "右移";
        //    }
        //    //检测向上移
        //    if (isMoveUp(provider.Get(Chirality.Left)))
        //    {
        //        leftStatusText.text = "左手状态：" + "上移";
        //    }
        //    if (isMoveDown(provider.Get(Chirality.Left)))
        //    {
        //        leftStatusText.text = "左手状态：" + "下移";
        //    }

        //    //检测   向上握拳
        //    if (isPlamUp(provider.Get(Chirality.Left)))
        //    {
        //        if (isFistPose(provider.Get(Chirality.Left)))
        //        {
        //            leftStatusText.text = "左手状态：" + "向上握拳";
        //            Keybd_event(65, 0, 0, 0);
        //            //Keybd_event(65, 0, 1, 0);
        //            Keybd_event(65, 0, 2, 0);
        //        }
        //    }
        //    //检测   向下握拳
        //    if (isPlamDown(provider.Get(Chirality.Left)))
        //    {
        //        if (isFistPose(provider.Get(Chirality.Left)))
        //        {
        //            leftStatusText.text = "左手状态：" + "向下握拳";
        //            Keybd_event(65, 0, 0, 0);
        //            //Keybd_event(65, 0, 1, 0);
        //            Keybd_event(65, 0, 2, 0);
        //        }
        //    }
        //}
        //else
        //{
        //    leftHandImg.color = Color.red;
        //    leftStatusText.text = "左手状态：" + "丢失";
        //}
        ////右手检测
        //if (provider.Get(Chirality.Right) != null)
        //{
        //    rightHandImg.color = Color.green;
        //    if (isStationary(provider.Get(Chirality.Right)))
        //    {
        //        rightStatusText.text = "右手状态：" + "静止";
        //    }
        //    if (isMoveLeft(provider.Get(Chirality.Right)))
        //    {
        //        rightStatusText.text = "右手状态：" + "左移";
        //    }
        //    if (isMoveRight(provider.Get(Chirality.Right)))
        //    {
        //        rightStatusText.text = "右手状态：" + "右移";
        //    }
        //    if (isMoveUp(provider.Get(Chirality.Right)))
        //    {
        //        rightStatusText.text = "右手状态：" + "上移";
        //    }
        //    if (isMoveDown(provider.Get(Chirality.Right)))
        //    {
        //        rightStatusText.text = "右手状态：" + "下移";
        //    }
        //    if (isFistPose(provider.Get(Chirality.Right)))
        //    {
        //        rightStatusText.text = "右手状态：" + "握拳";
        //    }
        //}
        //else
        //{
        //    rightHandImg.color = Color.red;
        //    rightStatusText.text = "右手状态：" + "丢失";
        //}

        //左手的检测
        if (_leftHand != null)
        {
            leftHandImg.color = Color.green;
            CheakHandStausAndPose(_leftHand);
        }
        else
        {
            leftHandImg.color = Color.red;
        }
        //右手的检测
        if (_rightHand != null)
        {
            rightHandImg.color = Color.green;
            CheakHandStausAndPose(_rightHand);
        }
        else
        {
            rightHandImg.color = Color.red;
        }

        if (Input.GetKeyDown(KeyCode.A))
        {
            print("A Press");
        }
    }

    void CheakHandStausAndPose(Hand hand)
    {
        //遗留问题   调用系统键盘按下事件会执行很多次
        //检测是否静止
        //是否右滑动（不在乎姿势
        if (hand.IsLeft)
        {
            if (isStationary(hand))
            {
                leftStatusText.text = "静止";
            }
            if (isMoveRight(hand))
            {
                leftStatusText.text = "右滑";
            }
            if (isMoveLeft(hand))
            {
                leftStatusText.text = "左滑";
            }
            if (isMoveForward(hand))
            {
                leftStatusText.text = "前滑";
            }
            if (isMoveBack(hand))
            {
                leftStatusText.text = "后滑";
            }
            if (isMoveDown(hand))
            {
                leftStatusText.text = "下滑";
            }
            if (isMoveUp(hand))
            {
                leftStatusText.text = "上滑";
            }
            //姿势判断
            if (isPlamUp(hand) && isOpenHand(hand))
            {
                leftPoseText.text = "手心向上张开";
            }
            if (isPlamDown(hand) && isOpenHand(hand))
            {
                leftPoseText.text = "手心向下张开";
            }
            if (isPlamUp(hand) && isFistPose(hand))
            {
                leftPoseText.text = "手心向上握拳";
            }
            if (isPlamDown(hand) && isFistPose(hand))
            {
                leftPoseText.text = "手心向下握拳";
            }
            //if (isPlamUp(hand) && isPinchPose(hand))
            //{
            //    leftPoseText.text = "手心向上捏合";
            //}
            //if (isPlamDown(hand) && isFistPose(hand))
            //{
            //    leftPoseText.text = "手心向下捏合";
            //}
        }
        else
        {
            if (isStationary(hand))
            {
                rightStatusText.text = "静止";
            }
            if (isMoveRight(hand))
            {
                rightStatusText.text = "右滑";
            }
            if (isMoveLeft(hand))
            {
                rightStatusText.text = "左滑";
            }
            if (isMoveForward(hand))
            {
                rightStatusText.text = "前滑";
            }
            if (isMoveBack(hand))
            {
                rightStatusText.text = "后滑";
            }
            if (isMoveDown(hand))
            {
                rightStatusText.text = "下滑";
            }
            if (isMoveUp(hand))
            {
                rightStatusText.text = "上滑";
            }
            //姿势判断
            if (isPlamUp(hand) && isOpenHand(hand))
            {
                rightPoseText.text = "手心向上张开";
            }
            if (isPlamDown(hand) && isOpenHand(hand))
            {
                rightPoseText.text = "手心向下张开";
            }
            if (isPlamUp(hand) && isFistPose(hand))
            {
                rightPoseText.text = "手心向上握拳";
            }
            if (isPlamDown(hand) && isFistPose(hand))
            {
                rightPoseText.text = "手心向下握拳";
            }
            //if (isPlamUp(hand) && isPinchPose(hand))
            //{
            //    rightPoseText.text = "手心向上捏合";
            //}
            //if (isPlamDown(hand) && isFistPose(hand))
            //{
            //    rightPoseText.text = "手心向下捏合";
            //}
        }
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="_type"></param>
    /// <param name="_mark"></param>
    /// <param name="active"></param>
    //void HandInfoLog(int _type,string _mark,bool active)
    //{
    //}
    //return bool
    protected bool isStationary(Hand hand)// 固定不动的 
    {
        return hand.PalmVelocity.Magnitude < smallestVelocity;
    }

    protected bool isMoveLeft(Hand hand)   // 手划向左边
    {
        return hand.PalmVelocity.x < -deltaVelocity && !isStationary(hand);
    }
    protected bool isMoveRight(Hand hand)   // 手划向右边
    {
        return hand.PalmVelocity.x > deltaVelocity && !isStationary(hand);
    }

    protected bool isMoveUp(Hand hand)   // 手划向上边
    {
        return hand.PalmVelocity.y > deltaVelocity && !isStationary(hand);
    }
    protected bool isMoveDown(Hand hand)   // 手划向下边
    {
        return hand.PalmVelocity.y < -deltaVelocity && !isStationary(hand);
    }

    protected bool isMoveForward(Hand hand)   // 手划向前边
    {
        return hand.PalmVelocity.z > deltaVelocity && !isStationary(hand);
    }
    protected bool isMoveBack(Hand hand)   // 手划向下边
    {
        return hand.PalmVelocity.z < -deltaVelocity && !isStationary(hand);
    }


    protected bool isFistPose(Hand hand)   // 手握拳
    {
        return hand.GetFistStrength() > fistStrenth;
    }

    protected bool isGrabPose(Hand hand)   // 手抓取
    {
        return hand.GrabStrength > 0.8f;
    }

    protected bool isPlamUp(Hand hand)   // 手掌方向
    {
        //1 手心向上
        return hand.PalmarAxis().y > 0.8f;
    }

    protected bool isPlamDown(Hand hand)   // 手掌方向 下
    {
        //1 手心向下
        return hand.PalmarAxis().y < -0.8f;
    }
    //捏   
    protected bool isPinchPose(Hand hand)
    {
        return hand.PinchStrength > 0.8f;
    }
    protected bool isOpenHand(Hand hand)         //手掌全展开
    {
        return hand.GrabStrength == 0;
    }

    [DllImport("user32.dll", EntryPoint = "keybd_event")]
    public static extern void Keybd_event(

       byte bvk,//虚拟键值 ESC键对应的是27

           byte bScan,//0

           int dwFlags,//0为按下，1按住，2释放

           int dwExtraInfo//0

           );




}

/*键盘键与虚拟键码对照表

　　　 　　字母和数字键　　　　 数字小键盘的键　　　　 　　功能键 　　　　　　　　其它键
　　　　　　键　　 键码　　　　　键　　 键码　　　　　　 键　　 键码 　　　　键　　　　　　键码
　　　　　　A　　　65　　　　　 0 　　96 　　　　　　　F1 　　112 　　　　Backspace 　　　 8
　　　　　　B　　　66　　　　　 1　　 97 　　　　　　　F2 　　113　　　　 Tab 　　　　　　  9
　　　　　　C　　　67          2 　　98 　　　　　　　F3 　　114　　　 　Clear 　　　　　  12
　　　　　　D　　　68　　　　　 3　　 99              F4 　　115　　　 　Enter 　　　　　  13
　　　　　　E　　　69 　　　　　4 　　100             F5 　　116　　　 　Shift　　　　　     16
　　　　　　F　　　70 　　　　　5 　　101             F6 　　117　　　 　Control 　　　　   17
　　　　　　G　　　71 　　　　　6　　 102　　　　　　  F7 　　118 　　 　 Alt 　　　　　　   18
　　　　　　H　　　72 　　　　　7 　　103　　　　　　  F8 　　119　　　 　Caps Lock 　　　  20
　　　　　　I　　　73 　　　　　8 　　104　　　　　　  F9 　　120　　　 　Esc 　　　　　　  27
　　　　　　J　　　74 　　　　　9　　 105　　　　　　  F10　　121　　　 　Spacebar　　　　32
　　　　　　K　　　75          * 　　106　　　　　　  F11　　122　　　 　Page Up　　　　  33
　　　　　　L　　　76          + 　　107　　　　　　  F12　　123　　　   Page Down 　　　34
　　　　　　M　　　77 　　　　  Enter  108　　　　　　 -- 　　--　　　　　End 　　　　　　  35
　　　　　　N　　　78          -　　  109　　　　　　 -- 　　-- 　　　 　Home　　　　　　36
　　　　　　O　　　79 　　　　　. 　　110　　　　　　  --　　 -- 　　 　　Left Arrow　　　    37
　　　　　　P　　　80 　　　　　/ 　　 111　　　　　　   --　　 -- 　　   Up Arrow　　　　  38
　　　　　　Q　　　81 　　　　　　-- 　　--　　　　　　　--　　 -- 　　 　Right Arrow 　　    39
　　　　　　R　　　82 　　　　　　-- 　　--　　　　　　　--　　 -- 　　 　Down Arrow 　　   40
　　　　　　S　　　83 　　　　　　-- 　　--　　　　　　　-- 　　-- 　　 　Insert 　　　　       45
　　　　　　T　　　84 　　　　　　-- 　　--　　　　　　　--　　 -- 　　 　Delete 　　　　      46
　　　　　　U　　　85 　　　　　　-- 　　--　　　　　　　-- 　　-- 　　 　Help 　　　　　     47
　　　　　　V　　　86 　　　　　　--　　 --　　　　　　　-- 　　-- 　　 　Num Lock 　　　   144
　　　　　　W　　　87 　　　　　　　　　
　　　　　　X　　　88 　　　　　
　　　　　　Y　　　89 　　　　　
　　　　　　Z　　　90 　　　　　
　　　　　　0　　　48 　　　　　
　　　　　　1　　　49 　　　　　
　　　　　　2　　　50 　　　　　　
　　　　　　3　　　51 　　　　　　
　　　　　　4　　　52 　　　　　　
　　　　　　5　　　53 　　　　　　
　　　　　　6　　　54 　　　　　　
　　　　　　7　　　55 　　　　　　
　　　　　　8　　　56 　　　　　　
　　　　　　9　　　57 　

*/
